<?php
namespace Pinenut\Config;

class Privileges extends \Pinenut\Config {

	/**
	 * Фильтрация по признакам
	 * 
	 * @param unknown $key
	 * @param unknown $value
	 * @return multitype:|boolean
	 */
	static function getFiltered($key, $value) {
		return array_filter(static::$config, 
			function ($v) use ($key, $value) {
				return isset($v[$key]) && $v[$key] == $value;
			});
	}
	
	static function getPrivilegesByProperty($property) {
		$roles = self::getFiltered($property, true);
		$privileges = array();
		foreach($roles as $role) {
			$privileges += $role['privileges'];
		}	
		// фильтруем полученный массив, чтобы были только уникальные значения
		$privileges = array_unique($privileges);
		// создаём массив, где ключ=значение и оба - имя привилегии
		$privileges = array_combine($privileges, $privileges);
			
		return (array)$privileges;
	}
	
	static function getPrivilegesOfRoles($roles) {
		$privileges = [];

		foreach ((array)$roles as $role) {
			$data = static::get($role);
			$privileges = array_merge(
					$privileges,
					(array)$data['privileges']
			);


			if (isset($data['inheritedRoles'])) {
				$inheritedRoles = static::getPrivilegesOfRoles($data['inheritedRoles']);
				$privileges = array_merge($privileges, array_values($inheritedRoles));
			}
		}
	
		// фильтруем полученный массив, чтобы были только уникальные значения
		$privileges = array_unique($privileges);
		// создаём массив, где ключ=значение и оба - имя привилегии
		$privileges = array_combine($privileges, $privileges);
		return (array)$privileges;
	}
}